package hos.permission;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import java.util.List;

import hos.permission.dialog.RationaleDialog;
import hos.permission.dialog.RationaleDialogFragment;

/**
 * <p>Title: PermissionRequest </p>
 * <p>Description: 权限请求 </p>
 * <p>Company: www.mapuni.com </p>
 *
 * @author : 蔡俊峰
 * @version : 1.0
 * @date : 2024-01-10 22:09
 */
public interface PermissionRequest {
    /**
     * 打开APP设置界面
     */
    void forwardToSettings();

    /**
     * 是否成功
     *
     * @return true 成功
     */
    boolean isSuccess();

    /**
     * 配置要请求的权限
     *
     * @param permissions 权限
     */
    @NonNull
    PermissionRequest permissions(@NonNull String... permissions);

    /**
     * 配置要请求的权限
     *
     * @param permissions 权限
     */
    @NonNull
    PermissionRequest permissions(@NonNull List<String> permissions);

    /**
     * 配置要请求的权限
     *
     * @param permissions 权限
     */
    @NonNull
    PermissionRequest permission(@NonNull String[] permissions);

    /**
     * 权限拒绝后调用
     *
     * @param refusedListener 拒绝监听
     */
    @NonNull
    PermissionRequest onRefused(@Nullable OnPermissionResultListener.onRefusedListener refusedListener);

    /**
     * 权限拒绝弹窗
     *
     * @param refusedDialogListener 拒绝弹窗监听
     */
    @NonNull
    PermissionRequest onRefusedDialog(@Nullable OnPermissionResultListener.onRefusedDialogListener refusedDialogListener);

    /**
     * 权限请求弹窗
     *
     * @param requestDialogListener 请求弹窗监听
     */
    PermissionRequest onRequestDialog(@Nullable OnPermissionResultListener.onRequestDialogListener requestDialogListener);

    /**
     * 取消按钮监听
     *
     * @param cancelListener 取消监听
     */
    @NonNull
    PermissionRequest onCancel(@Nullable OnPermissionResultListener.onCancelListener cancelListener);

    @NonNull
    PermissionRequest onSuccessFul(@Nullable OnPermissionResultListener.onSuccessFulListener successListener);


    @NonNull
    PermissionRequest defaultDialog();
    /**
     * 发起权限请求
     *
     * @param successListener 请求成功监听
     */
    void request(@NonNull OnPermissionResultListener.onSuccessListener successListener);

    /**
     * 弹窗权限请求对话框
     *
     * @param permissions  弹窗的权限
     * @param message      文字描述
     * @param positiveText 确定按钮
     * @param isRequest    是否正常请求 true 正常请求 false 跳转到app设置界面
     */
    void showPermissionDialog(
            @NonNull List<String> permissions,
            @NonNull String message,
            @NonNull String positiveText,
            boolean isRequest
    );

    /**
     * 弹窗权限请求对话框
     *
     * @param permissions  弹窗的权限
     * @param message      文字描述
     * @param positiveText 确定按钮
     * @param negativeText 取消按钮
     * @param isRequest    是否正常请求 true 正常请求 false 跳转到app设置界面
     */
    void showPermissionDialog(
            @NonNull List<String> permissions,
            @NonNull String message,
            @NonNull String positiveText,
            @Nullable String negativeText,
            boolean isRequest
    );

    /**
     * 弹窗权限请求对话框
     *
     * @param dialog    弹窗
     * @param isRequest 是否正常请求 true 正常请求 false 跳转到app设置界面
     */
    void showPermissionDialog(
            @NonNull RationaleDialog dialog,
            boolean isRequest
    );

    /**
     * 发起请求
     *
     * @param isRequest true 正常请求 false 跳转到app设置界面
     */
    void request(boolean isRequest);

    /**
     * 弹窗权限请求对话框
     *
     * @param dialogFragment 弹窗
     * @param isRequest      是否正常请求 true 正常请求 false 跳转到app设置界面
     */
    void showPermissionDialog(
            @NonNull RationaleDialogFragment dialogFragment,
            boolean isRequest
    );

    /**
     * 定位权限申请
     *
     * @param successListener 成功监听
     */
    void requestLocation(@NonNull OnPermissionResultListener.onSuccessListener successListener);

    /**
     * 后台定位权限申请
     *
     * @param successListener 成功监听
     */
    void requestLocationBackground(@NonNull OnPermissionResultListener.onSuccessListener successListener);

    /**
     * 拍照权限申请
     *
     * @param successListener 成功监听
     */
    void requestCamera(@NonNull OnPermissionResultListener.onSuccessListener successListener);

    /**
     * 音频权限申请
     *
     * @param successListener 成功监听
     */
    void requestAudio(@NonNull OnPermissionResultListener.onSuccessListener successListener);

    /**
     * 音频权限申请
     *
     * @param successListener 成功监听
     */
    void requestAudio_33(@NonNull OnPermissionResultListener.onSuccessListener successListener);

    /**
     * 储存权限申请
     *
     * @param successListener 成功监听
     */
    void requestStorage(@NonNull OnPermissionResultListener.onSuccessListener successListener);

    /**
     * Android 11 版本号30 储存权限申请
     *
     * @param successListener 成功监听
     */
    void requestStorageR(@NonNull OnPermissionResultListener.onSuccessListener successListener);

    /**
     * Android 13 版本号33 储存权限申请
     *
     * @param successListener 成功监听
     */
    void requestReadStorage(@NonNull OnPermissionResultListener.onSuccessListener successListener);

    /**
     * 储存权限申请（所有版本）
     *
     * @param successListener 成功监听
     */
    void requestAllStorage(@NonNull OnPermissionResultListener.onSuccessListener successListener);

    /**
     * 储存权限申请（所有版本）
     *
     * @param successListener 成功监听
     */
    void requestAllStorageCamera(@NonNull OnPermissionResultListener.onSuccessListener successListener);

    /**
     * 手机权限申请
     *
     * @param successListener 成功监听
     */
    void requestPhone(@NonNull OnPermissionResultListener.onSuccessListener successListener);

    /**
     * Android 8.0 版本号26 手机权限申请
     *
     * @param successListener 成功监听
     */
    void requestPhoneO(@NonNull OnPermissionResultListener.onSuccessListener successListener);

    /**
     * 通讯录权限申请
     *
     * @param successListener 成功监听
     */
    void requestContacts(@NonNull OnPermissionResultListener.onSuccessListener successListener);

    /**
     * 日历权限申请
     *
     * @param successListener 成功监听
     */
    void requestCalendar(@NonNull OnPermissionResultListener.onSuccessListener successListener);

    /**
     * 短信权限申请
     *
     * @param successListener 成功监听
     */
    void requestSms(@NonNull OnPermissionResultListener.onSuccessListener successListener);

    /**
     * 读取图片权限申请
     *
     * @param successListener 成功监听
     */
    void requestReadImage(@NonNull OnPermissionResultListener.onSuccessListener successListener);

    /**
     * 读取视频权限申请
     *
     * @param successListener 成功监听
     */
    void requestReadVideo(@NonNull OnPermissionResultListener.onSuccessListener successListener);

    /**
     * 系统弹窗权限申请
     *
     * @param successListener 成功监听
     */
    void requestSystemAlertWindow(@NonNull OnPermissionResultListener.onSuccessListener successListener);

    /**
     * 设置权限申请
     *
     * @param successListener 成功监听
     */
    void requestWriteSettings(@NonNull OnPermissionResultListener.onSuccessListener successListener);

    /**
     * 安装未知应用权限申请
     *
     * @param successListener 成功监听
     */
    void requestInstallPackages(@NonNull OnPermissionResultListener.onSuccessListener successListener);

    /**
     * 通知权限申请
     *
     * @param successListener 成功监听
     */
    void requestNotification(@NonNull OnPermissionResultListener.onSuccessListener successListener);

    /**
     * 传感器权限申请
     *
     * @param successListener 成功监听
     */
    void requestBodySensorsBackground(@NonNull OnPermissionResultListener.onSuccessListener successListener);

    /**
     * 释放
     */
    void dispose();

    /**
     * 清除所有监听事件
     */
    PermissionRequest clearListener();
}
